Amazon TranscribeのTranscription jobをBoto3を使ってLambdaで実行したらUnknown parameter(OutputStartIndex)でハマった件
Amazon Transcribeでは音声データから文字起こしをしてjsonファイルで出力されますが、いつの間にか出力フォーマットにSRT (SubRip)とVTT (WebVTT)も指定できるようになっていました。
動画データに字幕を埋め込むために、Transcription jobで作成されたjsonファイルからVTTにするスクリプトをLambdaで実行していたのですが、 これが不要になるかもと思ったので試しにLambdaで実行してみました。
Python3.9のランタイムを使用しています。
やってみた
サンプルコード
Adding subtitles to your Amazon Transcribe video files に載っているPython (Boto3)のサンプルコードをそのまま利用しました。
字幕のフォーマット指定は、Subtitles
というパラメータで指定します。
transcribe.start_transcription_job( TranscriptionJobName=job_name, Media={'MediaFileUri': job_uri}, MediaFormat='mp4', LanguageCode='ja-JP', Subtitles={ 'Formats': [ 'vtt' ], 'OutputStartIndex': 1 } )
- Subtitles(dict)
- Formats
- 字幕ファイルの出力形式を指定。srt と vtt の両方の形式を選択した場合、2 つの出力ファイルが生成されます
- OutputStartIndex
- 最初の字幕セグメントに割り当てられる開始値を定義。Amazon Transcribe のデフォルトの開始インデックスは 0 で、より広く使われている標準の 1 とは異なります。どちらの値を使用するか不明な場合は、他のサービスとの互換性を高めるために 1 を選択することをお勧めします。
- Formats
実行結果
lambdaのコンソールからテストを実行してみたら、
エラーとなってしまいました。
メッセージには
Parameter validation failed:\nUnknown parameter in Subtitles: \"OutputStartIndex\", must be one of: Formats
と OutputStartIndexが使えない という内容です。
ドキュメントにはちゃんと書いてあるのになぜ。。。
原因
最終的に原因は、
Lambdaのランタイムで使用されるboto3のバージョンがOutputStartIndex
に未対応のものだった。
ということでした。
boto3のchange logを調べる
transcribeのOutputStartIndexに関することが書いていないか調べてみることに。
changelogにバージョン1.21.26
で
Amazon Transcribeのバッチジョブで字幕を作成するための追加パラメータ: outputStartIndexが追加されました
というのを発見。
python3.9のランタイムでのboto3、botocoreのバージョンを調べる
ドキュメント には
boto3-1.18.55 botocore-1.21.55
と書かれていました。
boto3が1.18.55なので、確かに対応はしていないですね。
実際に関数から確認してみます。
import boto3 import botocore print('boto3 vertion: {0}'.format(boto3.__version__)) print('botocore vertion: {0}'.format(botocore.__version__))
を実行したら、
boto3 vertion: 1.20.32 botocore vertion: 1.23.32
となっていました。
1.20.32なのでboto3のバージョンが未対応のやつだったかとわかりました。
対応方法
Lambda LayerにBoto3のバージョンを上げたやつを適用することで実行できるようになります。
ローカルPCでboto3の最新版をインストールし、zipに固めて適用していきます。
zipのファイル構造は
boto3.zip │ python/boto3 └ python/~~~~~~
のように、python
フォルダの中にライブラリが入っている必要があります。
レイヤー作成 を参照しながらLambda Layerを作成しました。
関数から作成したレイヤーを使うには、
Lambdaのコード画面の下部にあるレイヤーの追加
を押して作成したレイヤーを選択すればOKです。
追加後、再度バージョンをチェックするコードを実行すると
boto3 vertion: 1.21.30 botocore vertion: 1.24.30
にちゃんと変わっていました。 1.21.26
以上なのでOutputStartIndex
も使えるはずなので、エラーになったstart_transcription_jobを実行する関数を再度動かしてみると、エラーなく関数は終了しました。
transcription jobも無事実行され、VTTも作成されていました。
やったぜ
おわり